﻿#ifndef OTHERINFOMODEL_H
#define OTHERINFOMODEL_H

#include <QObject>
#include <QAbstractTableModel>

// OtherInfo类用于存储其他信息，如名称、单位、值等
class OtherInfo{
public:
    // 构造函数，初始化名称、单位
    OtherInfo(QString name,QString unit);

    // 获取名称
    QString name() const;
    // 设置名称
    void setName(const QString &name);

    double v() const;
    void setV(double v);

    QString unit() const;
    void setUnit(const QString &unit);

    // 获取是否记录的标志
    bool record() const;
    void setRecord(bool record);

    // 获取是否扫描的标志
    bool scan() const;
    void setScan(bool scan);

private:
    QString m_name;
    double  m_v;
    QString m_unit;
    bool m_record; //记录
    bool m_scan; //扫描


};

// OtherInfoModel类继承自QAbstractTableModel，用于管理OtherInfo对象列表
class OtherInfoModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    // 定义OtherInfoRoles枚举，用于数据访问和表示
    enum OtherInfoRoles {
        nameRole = Qt::UserRole + 1,// 名称的角色
        vRole,// 值的角色的别名
        unitRole,// 单位的角色的别名
        recordRole,// 是否记录的角色
        scanRole// 是否扫描的角色
     };

    // 构造函数，接受一个父对象
    explicit OtherInfoModel(QObject *parent = 0);
    // 添加新的OtherInfo对象到模型
    Q_INVOKABLE void addOtherInfo(const QString &name,const QString &unit);
    // 清除模型中的所有OtherInfo对象
    Q_INVOKABLE void clear();

    // 返回模型中的行数
    int rowCount(const QModelIndex & parent = QModelIndex()) const;
    // 返回模型中的列数
    int columnCount(const QModelIndex & parent = QModelIndex()) const;

    // 返回指定模型索引和角色的数据
    QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;

    // 设置指定模型索引和角色的数据
    bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) ;

    // 返回指定行和列的模型索引
    QModelIndex getIndex(int row,int col);

    //----------------------全记录
     Q_INVOKABLE void allRecord(bool value);
    //----------------------分记录
     Q_INVOKABLE void record(int index,bool value);


    //----------------------全扫描
    Q_INVOKABLE void allScan(bool value);
    //----------------------分扫描
    Q_INVOKABLE void scan(int index,bool value);


    //--------------是否记录和扫描
    bool getRecord(int index);
    bool getScan(int index);

signals:
    // 当所有OtherInfo信息的记录状态改变时发出信号
    void isAllRecord(bool value);
    // 当所有OtherInfo信息的扫描状态改变时发出信号
    void isAllScan(bool value);

public slots:
protected:
    // 返回一个哈希表，将自定义角色映射到角色名称
    QHash<int, QByteArray> roleNames() const;
private:
    // OtherInfo信息列表
    QList<OtherInfo> m_otherInfo;

};

#endif // OTHERINFOMODEL_H
